package eolica
import br.leiam.eolica.facade.*
import br.leiam.eolica.util.EolicaUtil 
import br.leiam.eolica.util.Util 
import br.leiam.eolica.excecoes.*

class EolicaController {

	static final String VELOCIDADE_DO_VENTO = "Velocidade do Vento"
	static final String DADOS_PROBABILISTICOS = "Dados Probabilisticos"
	static final String PRODUCAO_DE_ENERGIA = "Producao de Energia"

	static final String TAC_01_TEIXEIRA = "TAC 01 - Teixeira"
	static final String TAC_02_JUAZEIRINHO = "TAC 02 - Juazeirinho"
	static final String TAC_03_DAMIAO = "TAC 03 - Damiao"
	static final String TAC_04_MATARACA = "TAC 04 - Mataraca"
	static final String TAC_05_CAMPINA_GRANDE = "TAC 05 - Campina Grande"
	static final String TAC_06_SANTA_RITA = "TAC 06 - Santa Rita"
	
	public static final String TURBINA1 = "500 Kw/40m"
	public static final String TURBINA2 = "1.5 Mw/70m"
	public static final String TURBINA3 = "2.0 Mw/83m"
	public static final String TURBINA4 = "2.11 Mw/100m"
	
	def afterInterceptor = { model, modelAndView ->
		try{
			if (session["isMobile"]) {
				modelAndView.viewName = modelAndView.viewName + "_m"
			 }
		}catch(NullPointerException e){}
	}
	
	
	def index = {
		List<String> torres = new LinkedList<String>();
		torres.add (TAC_01_TEIXEIRA);
		torres.add (TAC_02_JUAZEIRINHO);
		torres.add (TAC_03_DAMIAO);
		torres.add (TAC_04_MATARACA);
		torres.add (TAC_05_CAMPINA_GRANDE);
		torres.add (TAC_06_SANTA_RITA);
		request.setAttribute("torres", torres);
		
		List<String> tiposInformacao = new LinkedList<String>();
		tiposInformacao.add (VELOCIDADE_DO_VENTO);
		tiposInformacao.add (DADOS_PROBABILISTICOS);
		tiposInformacao.add (PRODUCAO_DE_ENERGIA);		
		request.setAttribute("tiposInformacao", tiposInformacao);
		
		List<String> alturas = new LinkedList<String>();
		alturas.add ("102");
		alturas.add ("100");
		alturas.add ("70");
		alturas.add ("13");
		request.setAttribute("alturas", alturas);
		
		List<String> turbinas = new LinkedList<String>();
		turbinas.add (TURBINA1);
		turbinas.add (TURBINA2);
		turbinas.add (TURBINA3);
		turbinas.add (TURBINA4);		
		request.setAttribute("turbinas", turbinas);
	}
	
	
	def paginaInicial = {		
		
		//render "session.user.ehAdministrator()= " + session.user.ehAdministrator()
		render(view:"/index")
	}
	
	def gerarGrafico = {
		
		def dataI = params["dataInicial"].getProperties().get ("calendarDate")
		def dataF = params["dataFinal"].getProperties().get ("calendarDate")
		def dataInicial = dataI.toString().substring (0, 10)+" "+ dataI.toString().substring (11, 19);
		def dataFinal = dataF.toString().substring (0, 10)+" "+ dataF.toString().substring (11, 19);
		String torre = request.getParameter("torre").substring (0, 6).toLowerCase().replace ('0' , '').replace (' ' , '');
		String tipoInformacao = request.getParameter("tipoInformacao");
		String altura = request.getParameter("altura");
		String turbina = request.getParameter("turbina");
		
		request.setAttribute("tipoInformacao", tipoInformacao);
		request.setAttribute("torre", torre);		
		request.setAttribute("altura", altura);
		request.setAttribute("turbina", turbina);
		request.setAttribute("dataInicial", dataInicial);
		request.setAttribute("dataFinal", dataFinal);
		
		if(!torre.toLowerCase().contains("tac")){
			throw new EolicaException(torre + " nao eh uma torre valida");
		}	
		System.out.println("Turbina escolhida: "+ turbina);	
	
		if(tipoInformacao.startsWith("Velocidade")){
			render(view:'gerarGraficoVelocidade')
		}else if(tipoInformacao.startsWith("Dados")){
			render(view:'gerarGraficosDadosProb')
		}else{
			render(view:'gerarGraficosProdEnergia')
		}
	}

	def showVelocidade = {
		String torre = params["torre"];		
		String altura = params["altura"];
		String dataInicial = params["dataInicial"];
		String dataFinal = params["dataFinal"];
		int alt = Integer.parseInt(altura);
		
		FacadeEolica facade = FacadeEolica.getInstance();
		byte[] figurasDecodificadas;
		String[] figuras;	
		
		int imageHeight = 350;
		int	imageWidth = 600;
		
		if (session["isMobile"]) {
			float fator = 0.6;
			imageHeight = (int)imageHeight*fator;
			imageWidth = (int)imageWidth*fator;
		}
		
		figuras = facade.gerarGraficoVelocidade(torre, alt,dataInicial, dataFinal, imageHeight, imageWidth);
		
		figurasDecodificadas = FacadeEolica.decode(figuras[0]);
		response.contentType = 'image/png'
		response.setContentLength(figurasDecodificadas.size())
		OutputStream out = response.getOutputStream();
		out.write(figurasDecodificadas);
		out.flush()
		
		
	}
	
	def showWeibull = {
		String torre = params["torre"];		
		String altura = params["altura"];
		String dataInicial = params["dataInicial"];
		String dataFinal = params["dataFinal"];
		
		int alt = Integer.parseInt(altura);
		
		FacadeEolica facade = FacadeEolica.getInstance();
		byte[] figurasDecodificadas;
		String[] figuras;				
		Util.threadSleep();
		
		int imageHeight = 380;
		int	imageWidth = 480;
		if (session["isMobile"]) {
			float fator = 0.7;
			imageHeight = (int)imageHeight*fator;
			imageWidth = (int)imageWidth*fator;
		}
		
		
		figuras = facade.gerarWeibull(torre, alt,dataInicial, dataFinal,imageHeight, imageWidth );
		
		figurasDecodificadas = FacadeEolica.decode(figuras[0]);
		response.contentType = 'image/png'
		response.setContentLength(figurasDecodificadas.size())
		OutputStream out = response.getOutputStream();
		out.write(figurasDecodificadas);
		out.flush()
	}
	
	def showRosaDosVentosVelocidades = {
		String torre = params["torre"];
		String altura = params["altura"];
		String dataInicial = params["dataInicial"];
		String dataFinal = params["dataFinal"];
		int alt = Integer.parseInt(altura);
		
		FacadeEolica facade = FacadeEolica.getInstance();
		byte[] figurasDecodificadas;
		String[] figuras;
		Util.threadSleep();
		
		int imageHeight = 190;
		int	imageWidth = 300;
		if (session["isMobile"]) {
			float fator = 0.8;
			imageHeight = (int)imageHeight*fator;
			imageWidth = (int)imageWidth*fator;
		}
		
		
		
		figuras = facade.gerarGraficoRosaDosVentosVelocidades(torre, alt,dataInicial, dataFinal, imageHeight, imageWidth);
		
		figurasDecodificadas = FacadeEolica.decode(figuras[0]);
		response.contentType = 'image/png'
		response.setContentLength(figurasDecodificadas.size())
		OutputStream out = response.getOutputStream();
		out.write(figurasDecodificadas);
		out.flush()
	}
	
	def showRosaDosVentosFrequencia = {
		String torre = params["torre"];
		String altura = params["altura"];
		String dataInicial = params["dataInicial"];
		String dataFinal = params["dataFinal"];
		int alt = Integer.parseInt(altura);
		
		FacadeEolica facade = FacadeEolica.getInstance();
		byte[] figurasDecodificadas;
		String[] figuras;
		Util.threadSleep();
		
		int imageHeight = 190;
		int	imageWidth = 300;
		if (session["isMobile"]) {
			float fator = 0.8;
			imageHeight = (int)imageHeight*fator;
			imageWidth = (int)imageWidth*fator;
		}
		figuras = facade.gerarGraficoRosaDosVentosFrequencia(torre, alt,dataInicial, dataFinal, imageHeight, imageWidth);
		
		figurasDecodificadas = FacadeEolica.decode(figuras[0]);
		response.contentType = 'image/png'
		response.setContentLength(figurasDecodificadas.size())
		OutputStream out = response.getOutputStream();
		out.write(figurasDecodificadas);
		out.flush()
	}
	
	def showFrequenciaDeDistribuicao = {
		String torre = params["torre"];
		String altura = params["altura"];
		String dataInicial = params["dataInicial"];
		String dataFinal = params["dataFinal"];
		int alt = Integer.parseInt(altura);
		
		FacadeEolica facade = FacadeEolica.getInstance();
		byte[] figurasDecodificadas;
		String[] figuras;
		Util.threadSleep();
		
		int imageHeight = 450;
		int	imageWidth = 450;
		if (session["isMobile"]) {
			float fator = 0.6;
			imageHeight = (int)imageHeight*fator;
			imageWidth = (int)imageWidth*fator;
		}
		figuras = facade.gerarGraficoFrequenciaDeDistribuicao(torre, alt,dataInicial, dataFinal, imageHeight, imageWidth);
		
		figurasDecodificadas = FacadeEolica.decode(figuras[0]);
		response.contentType = 'image/png'
		response.setContentLength(figurasDecodificadas.size())
		OutputStream out = response.getOutputStream();
		out.write(figurasDecodificadas);
		out.flush()
	}
	
	def showCurvaPotenciaAerogerador = {
		String torre = params["torre"];
		String altura = params["altura"];
		String turbina = params["turbina"];
		String dataInicial = params["dataInicial"];
		String dataFinal = params["dataFinal"];
		int alt = Integer.parseInt(altura);
		
		FacadeEolica facade = FacadeEolica.getInstance();
		byte[] figurasDecodificadas;
		String[] figuras;
		Util.threadSleep();
		
		
		int imageHeight = 450;
		int	imageWidth = 450;
		if (session["isMobile"]) {
			float fator = 0.6;
			imageHeight = (int)imageHeight*fator;
			imageWidth = (int)imageWidth*fator;
		}
		figuras = facade.gerarGraficoCurvaPotenciaAerogerador(torre, alt, EolicaUtil.getTurbina(turbina), dataInicial, dataFinal, imageHeight, imageWidth);
		
		figurasDecodificadas = FacadeEolica.decode(figuras[0]);
		response.contentType = 'image/png'
		response.setContentLength(figurasDecodificadas.size())
		OutputStream out = response.getOutputStream();
		out.write(figurasDecodificadas);
		out.flush()
	}
	
	
	def showTabela = {
		String torre = params["torre"];
		String altura = params["altura"];
		String turbina = params["turbina"];
		String dataInicial = params["dataInicial"];
		String dataFinal = params["dataFinal"];
		int alt = Integer.parseInt(altura);
		
		FacadeEolica facade = FacadeEolica.getInstance();
		byte[] figurasDecodificadas;
		String[] figuras;
		Util.threadSleep();
		
		int imageHeight = 336;
		int	imageWidth = 400;
		if (session["isMobile"]) {
			float fator = 0.1;
			imageWidth = (int)imageWidth*fator;
		}
		figuras = facade.gerarTabela(torre, alt, EolicaUtil.getTurbina(turbina), dataInicial, dataFinal, imageHeight, imageWidth);
		
		figurasDecodificadas = FacadeEolica.decode(figuras[0]);
		response.contentType = 'image/png'
		response.setContentLength(figurasDecodificadas.size())
		OutputStream out = response.getOutputStream();
		out.write(figurasDecodificadas);
		out.flush()
	}
	
	
}
